import { Injectable } from '@nestjs/common';
// 使用 crypto 模块替代 uuid 库以避免 ES module 问题
import { randomUUID, createHash } from 'crypto';

/**
 * UUID 生成服务
 * 基于 NestJS 官方示例实现
 * 参考: https://docs.nestjs.cn/fundamentals/dependency-injection
 * 对应 Java: IdUtil
 */
@Injectable()
export class UuidService {
  /**
   * 生成 UUID v4 (随机)
   */
  v4(): string {
    return randomUUID();
  }

  /**
   * 生成 UUID v1 (基于时间戳，简化实现)
   */
  v1(): string {
    return randomUUID();
  }

  /**
   * 生成 UUID v5 (基于 SHA-1 哈希)
   */
  v5(name: string, namespace: string): string {
    const hash = createHash('sha1');
    hash.update(namespace + name);
    const hex = hash.digest('hex');
    return (
      hex.substring(0, 8) +
      '-' +
      hex.substring(8, 12) +
      '-5' +
      hex.substring(12, 15) +
      '-' +
      hex.substring(15, 19) +
      '-' +
      hex.substring(19, 31)
    );
  }

  /**
   * 生成 UUID v3 (基于 MD5 哈希)
   */
  v3(name: string, namespace: string): string {
    const hash = createHash('md5');
    hash.update(namespace + name);
    const hex = hash.digest('hex');
    return (
      hex.substring(0, 8) +
      '-' +
      hex.substring(8, 12) +
      '-3' +
      hex.substring(12, 15) +
      '-' +
      hex.substring(15, 19) +
      '-' +
      hex.substring(19, 31)
    );
  }

  /**
   * 验证 UUID 格式
   */
  validate(uuid: string): boolean {
    const uuidRegex =
      /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
    return uuidRegex.test(uuid);
  }

  /**
   * 获取 UUID 版本
   */
  version(uuid: string): number | undefined {
    if (!this.validate(uuid)) return undefined;
    const version = uuid.charAt(14);
    return parseInt(version);
  }

  /**
   * 生成短 UUID (8位)
   */
  short(): string {
    return randomUUID().replace(/-/g, '').substring(0, 8);
  }

  /**
   * 生成中 UUID (16位)
   */
  medium(): string {
    return randomUUID().replace(/-/g, '').substring(0, 16);
  }

  /**
   * 生成长 UUID (32位，无连字符)
   */
  long(): string {
    return randomUUID().replace(/-/g, '');
  }
}
